package cn.tedu.submarine;
import java.util.Random;
import javax.swing.ImageIcon;
import java.awt.Graphics;
/* 海洋对象*/
public abstract class SeaObject {
    public static final int LIVE = 0;//活着的
    public static final int DEAD = 1;//死了的
    protected int state = LIVE;  //当前状态（默认为活着的）

   protected int width;   //宽
    protected int height;  //高
    protected int x; //x坐标
    protected int y; //y坐标
    protected int speed; //速度

    /*专门给侦察潜艇、鱼雷潜艇、水雷潜艇提供的  */
    //因为三种潜艇的宽和高是不一样的，所以数据不能写死，需传参写活
    //三种潜艇的x,y,speed一样，所以数据直接写死，不需传参
  public   SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        x = -width;//负的潜艇的宽
        Random rand = new Random();//随机数对象
        y =rand.nextInt(World.HEIGHT-height-150+1)+150 ;//150到460之间
        speed = rand.nextInt(3)+1;//1到3之间

    }
    /* 专门给战舰、水雷、鱼雷、深水炸弹提供*/
    //四种对象的宽/高/x/y/speed都是不一样的，所以数据不能写死，需传参写活
   public SeaObject(int width,int height,int x,int y,int speed){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }


    //移动
  public abstract void step();

   /** 获取对象的图片*/
   public abstract ImageIcon getImage();

   /**  判断对象是否是活着的*/
   public boolean isLive(){
       return state==LIVE; //若当前状态为LIVE，表示为活着的，则返回true，否则返回false
   }
    /**  判断对象是否为死了 的*/
   public boolean isDead(){
       return state==DEAD;//若当前状态为DEAD，表示为死了的，则返回true，否则返回false
   }

   /**  画图片  g:画笔 */
   public void paintImage(Graphics g){
       if(isLive()){//若活着的
          this.getImage().paintIcon(null,g,x,y);//画图片


       }
   }

    /** 潜艇发射雷 生成雷对象 */
    public SeaObject shootThunder(){
      int x = this.x+this.width;//x：潜艇的x+潜艇的宽
        int y = this.y-5; //y：潜艇的y-5
        if(this instanceof TorpedoSubmarine){//若对象为鱼雷潜艇
            return new Torpedo(x,y);//生成鱼雷
        }else if(this instanceof MineSubmarine){// 若对象为水雷潜艇
           return new Mine(x,y);//生成水雷
        }else{//若对象为侦察潜艇
             return null;//不生成雷
        }
    }

    /**   检测潜艇越界 */
    public boolean isOutOfBounds(){
        return x>World.WIDTH;//潜艇的x>=窗户的宽，即为越界了
    }

    /**  检测碰撞 */
    public boolean isHit(SeaObject other){
        //假设：this为潜艇，other为炸弹
        int x1 = this.x-other.width;                          //x1：潜艇的x-炸弹的宽
        int x2 = this.x+this.width;                          //x2：潜艇的x+潜艇的宽
        int y1 = this.y-other.height;                       //y1：潜艇的y-炸弹的高
        int y2 = this.y+this.height;                       //y2：潜艇的y+潜艇的高
        int x = other.x;                                  //x：炸弹的x
        int y = this.y;                                 //y：炸弹的y
        return x>=x1 && x<=x2 && y>=y1 && y<=y2;
        //x在x1与x2之间，并且y在y1与y2之间，即为撞上了

    }
    /*
    假设： s为潜艇    b为炸弹  t为雷  ship为战舰
    1）b.isHit(s);------------this指炸弹，other指潜艇
    2）s.isHit(b);------------this指潜艇，other指炸弹
    3）t.isHit(ship);---------this指雷，other指战舰
    4）ship.isHit(t);---------this指ship，other指雷
     */
    /**  海洋对象去死 */
    public void goDead(){
        state = DEAD;//将对象状态修改为DEAD死了的

    }
}
